import com.sun.jdi.ArrayReference;

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;

/**
 * 文件类别
 * 文件在文件系统中以二进制的凡是储存在磁盘上
 * 在阅读文件时会依赖字符编码（ascll utf-8等等）来将文件翻译
 * 二进制文件：打开这个文件读不懂，就是二进制文件
 * 文本文件：读得懂
 * 目录 文件夹
 * 储存文件的文件夹
 * 文件
 * 在文件系统中不是目录的都是文件 txt
 * 路径
 * C:\Users\15328\OneDrive\桌面\files\4.javaee初阶课件 这是一个路径
 * 基准路径
 * 表示的是当前文件所在的目录位置
 * 按照不同的运行方式，获取到的基准路径是不同的 比如在ideal中运行，基准路基就是当前项目所在的位置
 * 如果是打一个jar包，那么基准路径就是jar包所在的位置
 * 总的来说基准路径就是你运行的程序所在的目录
 * 相对路径 从基准路径出发
 * ./xxx.xxx 中的.就表示的是在当前基准目录下有这个xx文件
 * ../xx.xx 中的..表示的是在基准目录的上一次目录有这个文件
 * 绝对路径
 * 从系统根目录开始指向你的文件所在位置的一条路径，不依赖与当前的工作路径
 * 不管在文件系统的哪里都能指向文件或目录的路径
 */

/**
 * 文件内容操作 stream
 * 数据输入输出的判断
 * 屁股坐在cup数据往你面前来就是输入 远离你就是输出
 */
public class stream {


    public static void main(String[] args) {
        String s = "C:\\Users\\15328\\OneDrive\\桌面\\files\\4.javaee初阶课件\\1. 计算机是如何工作的.pdf";
        System.out.println(s.substring(s.lastIndexOf(".")));
        File f = new File("C:\\Users\\15328\\OneDrive\\桌面/ww");
        f.mkdirs();
        System.out.println(f.exists());
        File nf = new File("C:\\Users\\15328\\OneDrive\\桌面/ww" + "/" + f.getName());
        try {
            nf.createNewFile();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //使用流来与文件的数据进行操作
    public static void mainc(String[] args) throws IOException {
        File file = new File("C:\\Users\\15328\\OneDrive\\桌面\\text.txt");

        System.out.println(file.getName());
        //使用scanner来读取数据
        InputStream inputStream = new FileInputStream(file);

        //套一层scanner的壳子，这样方便时用
        Scanner sc = new Scanner(inputStream);

        if(sc.hasNext()) {
            sc.next();
        }

        //写入数据
        OutputStream outputStream = new FileOutputStream(file,true);
        //套PrintWriter壳子来进行写入
        PrintWriter printWriter = new PrintWriter(outputStream);

        printWriter.println("hhh");

        printWriter.flush();

        System.out.println(sc.next());

    }
    public static void mainCharacter(String[] args) throws IOException {
        File file = new File("C:\\Users\\15328\\OneDrive\\桌面\\text.txt");
        //字符流
        //输入 数据流入cpu
        FileReader reader = new FileReader("C:\\Users\\15328\\OneDrive\\桌面\\text.txt");
        FileReader reader1 = new FileReader(file); // 这时就相当于打开了这个文件

        //输出 数据流出cpu
        FileWriter writer = new FileWriter("C:\\Users\\15328\\OneDrive\\桌面\\text.txt");

        //这时是将数据写道缓冲区中，并没有写道文件中，只有等到使用flush刷新或者关闭时才会写到文件中
        //这样通过减少io的次数来增加效率
        writer.write("你好");

        writer.flush();
//        System.out.println(reader.read());//返回的是读取的数据， -1 表示读完了

        //读取整个文本
//        while (true) {//这样写一次io读一个字符，效率太低了
//            int b = reader.read();
//            if (b == -1) {
//                break;
//            }
//            System.out.printf("%c",b);
//        }

        char[] buf = new char[1024];
        while(true) {
            int b = reader.read(buf);
            if(b == -1) {
                break;
            }

            //

            for (int i = 0; i < b; i++) {
                System.out.print(buf[i]);
            }

        }

        //防止资源的泄露
        writer.close();
        reader.close();
    }
    //第一节eePlus当然上哦
    public static void mainIN(String[] args) throws IOException {
        //字节流 以字节为单位读取文件中的数据
        File f = new File("C:\\Users\\15328\\OneDrive\\桌面\\text.txt");
//        System.out.println(f.createNewFile());

        //读取 从文件中读取数据流入到cpu中  所以是读取操作
        //写入数据到文件中，因为数据是从cpu流向文件中的所以是输出操作

        //在文件的末位进行添加
        try ( OutputStream out = new FileOutputStream(f, true);
                InputStream in = new FileInputStream(f);
        ) {

            byte[] buf = new byte[1024];
            while(true) {
                int b = in.read(buf);
                if(b == -1) {
                    break;
                }
                for (int i = 0; i < b; i+=3) {
                    //以i为开始每次偏移3个字节然后以utf-8的方式去编码
                    String s = new String(buf, i, 3,     "UTF-8");
                    System.out.print(s);
                }
                System.out.println();
                for (int i = 0; i < b; i++) {
                    System.out.printf("%x",buf[i]);
                }
            }
        }

//        e4bda0  e5a5bd

//        byte[] a = {'a', 'b', 'c'};
//        out.write(a);
//        byte[] ae = new byte[10];
//        in.read(ae);
//        System.out.println(Arrays.toString(ae));
    }
}

class FileMethod {
    public static void main(String[] args) {
        File file = new File("C:/hallo/files");
        //父目录指得是C:/hallo/  子目录指的是files
//        System.out.println(file.mkdir());//创建目录 如果最终目标目录的父目录不存在，那么就不会创建这个目录
        //只有存在父目录，才就会创建这个目录
        System.out.println(file.mkdirs());//创建多级目录 如果他的父目录不存在，那么就会创建他的父目录
        //之后创建目标目录
        System.out.println(file.isDirectory());
        System.out.println(file.exists());
        System.out.println(file.getPath());
        System.out.println(file.delete());
    }
    public static void main2(String[] args) throws IOException {
        File file = new File("file.txt");

        System.out.println(file.createNewFile());//创建新文件，返回值为boolean
        System.out.println(file.getCanonicalFile());
        System.out.println(file.exists());

        File dest = new File("newName.txt");
//        System.out.println(dest.createNewFile());

        System.out.println(dest.getCanonicalFile());

        //实际的执行是将file储存的内容复制到dest这个位置下并创建一个新的文件
        //而实际文件的位置也就变为了dest所在的这里
        //然后原来的file文件会被删除，只不过file对他的引用还存在，所以打印位置时看着并没有变
        System.out.println("文件重命名 -> " + file.renameTo(dest));
        System.out.println("dest -> "+dest.getCanonicalFile());
        System.out.println("dest -> "+dest.exists());
        System.out.println("file -> "+file.getCanonicalFile());
        System.out.println("file -> "+file.exists());
        file.deleteOnExit();//在jvm运行结束是才会删除这个文件
        dest.deleteOnExit();
    }
    public static void main0(String[] args) throws IOException {
//        File file = new File("./text.txt");
        File file = new File("C:\\Users\\15328\\OneDrive\\桌面\\files");
        System.out.println(file.getAbsoluteFile());//获取绝对路径
        System.out.println(file.getCanonicalFile());//会把相对路径的.干掉
        System.out.println(file.getPath());
        System.out.println(file.getParent());
        System.out.println(file.getParentFile());
        System.out.println(Arrays.toString(file.list()));//获得的是当前目录下所有文件的名字
        File[] files = file.listFiles();//获得的是所有文件
        System.out.println(file.exists());//再基准路径下找这个文件是否存在
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());


    }
}